#include <stdio.h>
#include <string.h>
#include <stdlib.h>//随机数 动态申请空间
#include <assert.h>//assert(arr != NULL);如果不满足就停止程序
#include <math.h>
#include <time.h>
#include <unistd.h>//用于使用延时函数,将代码延时触发
#include "password.h"
#include "login.h"
#include "json/cJSON.h"

//删除: 输入链表头结点和账户编号,删除账户;
//参数:链表头节点和需要删除的账户编号
//返回值:链表头节点
USE *rm_user_table(USE *head_user,int num){
	USE *end=head_user;
	USE *temp=NULL;
	for(int i=1;end->next!=NULL;i++){
		if(i==num){
			//计入日志
			FILE *pf_log=fopen("log.txt","a+");
			fprintf(pf_log,"时间:%s,删除账户%s\n",gettime(),end->next->use_name);
			if(fclose(pf_log)==EOF){
				perror("fclose");
			}
			temp=end->next;
			end->next=end->next->next;
			free(temp);
			
			break;//删除完就释放,不然会因为长度不对报错
		}
		end=end->next;
	}
	return head_user;
}

//修改: 输入链表头结点和账户编号,修改账户内容;
//参数:链表头节点和需要修改的账户编号
//返回值:链表头节点
USE *change_user_table(USE *head_user,int num){
	USE *end=head_user;
	USE *temp=NULL;
	//接收原本账户信息
	for(int i=1;end->next!=NULL;i++){
		if(i==num){
			break;
		}
		end=end->next;
	}
	//接收新账户信息
	printf("  1:修改原账户名:%s\n  2:修改原密码:%s\n  3:修改原权限:%c\n  按其他任意键退出",end->next->use_name,end->next->use_password,end->next->use_ability);
	int ch;
	ch=getchar();
	//记入日志
	FILE *pf_log=fopen("log.txt","a+");
	char *arr;
	if(ch==1){
		arr="账户名";
	}else if(ch==2){
		arr="密码";
	}else if(ch==3){
		arr="权限";
	}
	if(ch<=3 && ch>=1){
		fprintf(pf_log,"时间:%s,修改原账户:%s,修改项:%s\n",gettime(),end->next->use_name,arr);
	}
	if(fclose(pf_log)==EOF){
		perror("fclose");
	}
	
	if(ch!='\n'){
		while(getchar()!='\n');
	}
	switch(ch){
		case '1':
			printf("  请输入9位字符内新账户名:");
			scanf("%s",end->next->use_name);
			getchar();
			end->next->use_name[9]='\0';
			break;
		case '2':
			printf("  请输入9位字符内新账户密码:");
			scanf("%s",end->next->use_password);
			getchar();
			end->next->use_password[9]=0;
			break;
		case '3':
			printf("  是否开通修改权限:(y/n)(无权限账户仅能进入售货系统)\n");
			scanf("%c",&end->next->use_ability);
			getchar();
			if(end->next->use_ability!='y'&&end->next->use_ability!='n'){
				end->next->use_ability='n';
			}
			if(num==1&&end->next->use_ability!='y'){
				printf("  初始账号权限无法降低\n");
				end->next->use_ability='y';
			}
			break;
	}
	puts("");
	return head_user;
}


//账户系统:进入账户修改系统,可以进行对账号的增删改查
//参数:链表头节点和登录权限
//返回值:0
char pas_buff[1024]={0};
int use_system(USE *head_user,char ability){
	int ch = 0;

	TRAN node;

	//判断权限
	while(ch!=-1){
		bzero(node,sizeof(node));
		//选择菜单
		printf("请选择账户操作:\n1:注销账户\n2:修改账户密码");
		scanf("%d",&ch);
		if(ch!=1 && ch!=2){//退出
			break;
		}
		
		//创建TCP类型套接字
		int client_socket=socket(AF_INET,SOCK_STREAM,0);

		//向服务端发起连接请求
		struct sockaddr_in saddr;
		saddr.sin_family = AF_INET;
		saddr.sin_port = htons(get_port);   //port 
		saddr.sin_addr.s_addr = inet_addr(get_piv);   //ip
		int isok = connect(client_socket,(struct sockaddr*)&saddr,sizeof(saddr));
		if(isok == -1)
		{
			perror("connect");	
			return -1;
		}
		printf("已成功与服务器建立连接\n");
		switch(ch){
			case 1:
				//删除功能
				strcpy(node.order,"delete");
				strcpy(node.name,"null");
				strcpy(node.pas,"delete");
				
				
				printf("请输入账户密码完成账户注销");
				scanf("%d",&num);
				getchar();
				if(num==1){
					printf("  初始账号无法删除或降低权限\n");
					break;
				}
				rm_user_table(head_user,num);
				break;
			case 2:
				//修改功能
				strcpy(node.order,"modify")
				strcpy(node.name,"null");
				strcpy(node.pas,"delete");
				
				add_user_table(head_user);
				break;
			default:
				break;
		}
		packJson(&node);
		printf("准备向服务端发送信息:%s\n",pas_buff);
		write(client_socket,pas_buff,strlen(pas_buff));
		
		
		//将文件描述符改为非阻塞状态便于read使用
		int flags, s;
		// 获取当前的文件状态标志
		flags = fcntl(client_socket,F_GETFL,0);
		if (flags == -1) {
			perror("fcntl F_GETFL");
			return -1;
		}
		// 添加O_NONBLOCK标志
		flags |= O_NONBLOCK;
		// 设置新的文件状态标志
		s = fcntl(client_socket,F_SETFL,flags);
		if (s == -1) {
			perror("fcntl F_SETFL");
			return -1;
		}
		
		
		puts("准备从服务器接收返回值");
		bzero(buff,sizeof(buff));
		sleep(2);
		int num=read(client_socket,buff,1024);
		if(num<=0){
			puts("已超时,未能接收到返回值");
			return -1;
		}
		else
			printf("接收到返回值:%s\n",pas_buff);
		printf("客户端退出\n");	
		close(client_socket);
		if(strcmp(suc,buff)==0)
			return 0;
		else
			return -1;
		}
	
	return 0;	
}


typedef struct{
	char order[20];//信息用途 比如登录,注册...
	char name[20];//账户名
	char pas[20];//密码
}TRAN;

void packJson(TRAN *head)
{
	cJSON* root = cJSON_CreateObject();
	cJSON* order = cJSON_CreateString(head->order);
	cJSON* name = cJSON_CreateString(head->name);
	cJSON* pas = cJSON_CreateString(head->pas);

	cJSON_AddItemToObject(root,"order",order);
	cJSON_AddItemToObject(root,"name",name);
	cJSON_AddItemToObject(root,"pwd",pas);
	
	char *p=pas_buff;
	p=cJSON_Print(root);
	strcpy(pas_buff,p);
	cJSON_Delete(root);
}

